const express = require('express');
const router = express.Router();
const { User } = require('../models');
const bcrypt = require('bcryptjs');
const jwt = require('jsonwebtoken');
const JWT_SECRET = process.env.JWT_SECRET;

// 注册普通用户
router.post('/register', async (req, res) => {
  try {
    const { username, password, email } = req.body;
    
    // 检查用户是否已存在
    const existingUser = await User.findOne({ where: { username } });
    if (existingUser) {
      return res.status(400).json({ error: '用户名已存在' });
    }
    
    const hashedPassword = await bcrypt.hash(password, 10);
    
    const newUser = await User.create({
      username,
      password: hashedPassword,
      email,
      isAdmin: false // 确保普通用户注册时isAdmin为false
    });
    
    res.status(201).json({ 
      success: true,
      message: '注册成功',
      data: {
        username: newUser.username,
        email: newUser.email,
        isAdmin: newUser.isAdmin,
        created_at: newUser.created_at
      },
      instructions: '请使用注册的用户名和密码在登录接口(/api/auth/login)获取访问令牌'
    });
  } catch (error) {
    console.error('注册失败:', error);
    res.status(500).json({ 
      success: false,
      error: '注册失败',
      message: error.message 
    });
  }
});

// 普通用户登录
router.post('/login', async (req, res) => {
  try {
    const { username, password } = req.body;
    const user = await User.findOne({ where: { username } });
    
    if (!user) return res.status(401).json({ 
      success: false,
      error: '认证失败',
      message: '用户名或密码不正确'
    });
    
    const isPasswordValid = await bcrypt.compare(password, user.password);
    if (!isPasswordValid) return res.status(401).json({ 
      success: false,
      error: '认证失败',
      message: '用户名或密码不正确'
    });
    
    // 如果是管理员，拒绝使用普通用户登录接口
    if (user.isAdmin) {
      return res.status(403).json({ 
        success: false,
        error: '登录接口错误',
        message: '管理员请使用管理员登录接口(/api/auth/admin/login)'
      });
    }
    
    const token = jwt.sign({ 
      id: user.id,
      isAdmin: user.isAdmin 
    }, JWT_SECRET, { expiresIn: '15d' });
    
    // 返回更详细的用户信息和令牌使用说明
    res.json({
      success: true,
      message: '登录成功',
      data: {
        user: {
          id: user.id,
          username: user.username,
          email: user.email,
          isAdmin: user.isAdmin
        },
        token: token,
        expires_in: '15天',
        token_type: 'Bearer'
      },
      instructions: {
        description: '请在后续API请求中使用以下格式添加认证头:',
        auth_header: 'Authorization: Bearer ' + token,
        example: '例如: 访问 /api/airoles 时，在请求头中添加上面的Authorization头'
      }
    });
  } catch (error) {
    console.error('登录失败:', error);
    res.status(500).json({ 
      success: false,
      error: '登录失败',
      message: error.message 
    });
  }
});

// 管理员登录
router.post('/admin/login', async (req, res) => {
  try {
    const { username, password } = req.body;
    const user = await User.findOne({ where: { username } });
    
    if (!user) return res.status(401).json({ 
      success: false,
      error: '认证失败',
      message: '用户名或密码不正确'
    });
    
    const isPasswordValid = await bcrypt.compare(password, user.password);
    if (!isPasswordValid) return res.status(401).json({ 
      success: false,
      error: '认证失败',
      message: '用户名或密码不正确'
    });
    
    // 检查是否是管理员
    if (!user.isAdmin) {
      return res.status(403).json({ 
        success: false,
        error: '权限不足',
        message: '非管理员用户，无权访问管理员接口',
        instructions: '请使用普通用户登录接口(/api/auth/login)'
      });
    }
    
    const token = jwt.sign({ 
      id: user.id,
      isAdmin: user.isAdmin 
    }, JWT_SECRET, { expiresIn: '15d' });
    
    // 返回更详细的管理员信息和令牌使用说明
    res.json({
      success: true,
      message: '管理员登录成功',
      data: {
        user: {
          id: user.id,
          username: user.username,
          email: user.email,
          isAdmin: user.isAdmin
        },
        token: token,
        expires_in: '15天',
        token_type: 'Bearer'
      },
      instructions: {
        description: '请在后续API请求中使用以下格式添加认证头:',
        auth_header: 'Authorization: Bearer ' + token,
        example1: '例如: 访问 /api/airoles 时，在请求头中添加上面的Authorization头',
        example2: '访问管理员特有接口如 POST /api/airoles (创建AI角色)时，也使用相同的认证头',
        note: '此令牌包含管理员权限，可以访问所有接口'
      },
      admin_endpoints: [
        '创建AI角色: POST /api/airoles',
        '更新AI角色: PUT /api/airoles/{id}',
        '删除AI角色: DELETE /api/airoles/{id}'
      ]
    });
  } catch (error) {
    console.error('管理员登录失败:', error);
    res.status(500).json({ 
      success: false,
      error: '登录失败',
      message: error.message 
    });
  }
});

// 创建管理员账号（仅用于初始设置，实际应用中可能需要更安全的方式）
router.post('/admin/register', async (req, res) => {
  try {
    const { username, password, email, adminKey } = req.body;
    
    // 验证管理员注册密钥
    if (adminKey !== process.env.ADMIN_REGISTER_KEY) {
      return res.status(403).json({ 
        success: false,
        error: '无效的管理员注册密钥',
        message: '请提供正确的管理员注册密钥'
      });
    }
    
    // 检查用户是否已存在
    const existingUser = await User.findOne({ where: { username } });
    if (existingUser) {
      return res.status(400).json({ 
        success: false,
        error: '用户名已存在',
        message: '请使用其他用户名'
      });
    }
    
    const hashedPassword = await bcrypt.hash(password, 10);
    
    const newAdmin = await User.create({
      username,
      password: hashedPassword,
      email,
      isAdmin: true
    });
    
    res.status(201).json({ 
      success: true,
      message: '管理员注册成功',
      data: {
        username: newAdmin.username,
        email: newAdmin.email,
        isAdmin: newAdmin.isAdmin,
        created_at: newAdmin.created_at
      },
      instructions: '请使用注册的管理员账号在管理员登录接口(/api/auth/admin/login)获取访问令牌'
    });
  } catch (error) {
    console.error('管理员注册失败:', error);
    res.status(500).json({ 
      success: false,
      error: '注册失败',
      message: error.message 
    });
  }
});

module.exports = router;  